package com.cy.pj.sys.web.controller;

import com.cy.pj.common.util.PageUtil;
import com.cy.pj.sys.pojo.SysNotice;
import com.cy.pj.sys.service.SysNoticeService;
import com.cy.pj.sys.web.pojo.JsonResult;
import com.github.pagehelper.ISelect;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.sql.SQLException;

/**
 *此对象为公告模块控制层处理器对象
 * 1.请求url设计
 * 1)条件查询（请求方式-Get）
 * 2）新增公告（）
 * 3）基于id查询（请求方式-Get，请求url-"/notice/"）
 * 4）更新公告（）
 * 5）删除公告
 * 2.请求参数设计
 * 1）参数传递方式
 * 1.1.1）http://ip:port/?title=my&type=1
 * 1.1.2）http://
 * 1.1.3）
 * 1.1.4）
 * 1.2）服务端接收请求参数
 * 1.2.1）直接量（8种基本数据类型，字符串，日期）
 * 1.2.2）pojo对象（但是需要提供和参数名对应的set方法）
 * 1.2.3）map对象（前提是必须使用@RequestParam、@RequestBody注解对参数进行描述）
 *
 * 1.3）方法参数描述
 * 1.3.1）@PathVariable  用于获取请求url中｛｝内部变量
 * 1.3.2）RequeseBody    用于获取请求体重json格式的数据
 * 1.3.3）@RequestParam  用于获取非json格式的请求参数
 * 1.3.4）@DateTimeFormat用于设置可以接受的时期格式字符串
 */

//@ResponseBody
//@Controller
@RestController
@RequestMapping("/notice/")//根路径
public class SysNoticeController {
    @Autowired
    private SysNoticeService sysNoticeService;

    /**
     * 更新公告信息
     * @param notice 封装了公告信息的参数对象
     * @return
     */
    @PutMapping
    public JsonResult doUpdateNotice(@RequestBody SysNotice notice){
        sysNoticeService.updateNotice(notice);
        return new JsonResult("update ok");
    }



    /**
     * rest风格的url中允许使用变量。但这个变量需要使用{}括起来
     * 当我们在方法参数种子哪个需要这个变量的值是，可以使用@PathVariable
     *                                            对方法参数进行描述
     * 访问url:http://localhost/notice/1
     * @param id
     * @return
     */
//@GetMapping("{id}/{a}/{b}/{c}")
    @GetMapping("{id}")
    public JsonResult doFindById(@PathVariable("id") Long id){
        return new JsonResult(sysNoticeService.findById(id));
    }


    /**
     * 新增公告信息
     * @param sysNotice 封装客户端提交的信息，加入使用@RequestBody对参数
     *                  进行描述，客户端可以向服务端传递json格式的字符串参数
     *                  服务端拿到字符串，会将其转换为参数类型对象(json反序列化)
     *                  ps：一个方法中只能有一个参数使用@RequestBody注解进行描述
     * @return
     */
    @PostMapping
    public JsonResult doSaveNotice(@RequestBody SysNotice sysNotice){

        sysNoticeService.saveNotice(sysNotice);

        return new JsonResult("save ok");//json序列化
    }

    //请求url:http://localhost:80/notice/
    @GetMapping
    public JsonResult doFindNotices(SysNotice sysNotice, HttpServletRequest request) {

        String pageCurrent=request.getParameter("pageCurrent");
        //启动分页查询拦截

//        return new JsonResult(PageHelper.startPage(1,3)
//                .doSelectPageInfo(() ->
//                        sysNoticeService.findNotice(sysNotice)
//                ));
        return new JsonResult(PageUtil.startPage()
        .doSelectPageInfo(()->
                sysNoticeService.findNotice(sysNotice)));
//        这个结果会返回给调用方(DispatcherServlet)
//        方法调用方拿到方法执行结果以后会低调用相关api将结果转换为json格式字符串
//        最后通过Respon对象，将字符串响应到客户端
    }
    @DeleteMapping("{id}")
    public JsonResult doDeleteById(@PathVariable Long... id){
        sysNoticeService.deleteById(id);
        return new JsonResult("delete ok");
    }

}
